<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			/**
			 * @param {number[]} nums
			 * @return {number[][]}
			 */
			const removeRepeat = (arr) => {
				const obj = {};
				return arr.filter(item => {
					if (!obj[item.toString()]) {
						obj[item.toString()] = item.toString();
						return item;
					}
				});
			}
			var threeSum = function(nums) {
				nums.sort((a, b) => a - b);
				let r = [];
				for (let i = 0; i <= nums.length - 1; i++) {
					if (nums[i] == nums[i - 1]) {
						continue;
					}
					r = [...r, ...twoSum(nums, i + 1, -nums[i])];
				}
				r = removeRepeat(r);
				return r;
			};
			var twoSum = function(numbers, start, target) {
				let i = start;
				let j = numbers.length - 1;
				let result = [];
				while (i < j) {
					if (numbers[i] + numbers[j] == target) {
						result.push([numbers[i], numbers[j], -target]);
						i++;
					} else if (numbers[i] + numbers[j] > target) {
						j--;
					} else {
						i++;
					}
				}
				return result;
			};
			// 循环内不考虑去重 
			// var threeSum = function(nums) {
			//     const len = nums.length;
			//     if(len < 3) return [];
			//     nums.sort((a, b) => a - b);
			//     const resSet = new Set();
			//     for(let i = 0; i < len - 2; i++) {
			//         if(nums[i] > 0) break;
			//         let l = i + 1, r = len - 1;
			//         while(l < r) {
			//             const sum = nums[i] + nums[l] + nums[r];
			//             if(sum < 0) { l++; continue };
			//             if(sum > 0) { r--; continue };
			//             resSet.add(`${nums[i]},${nums[l]},${nums[r]}`);
			//             l++;
			//             r--;
			//         }
			//     }
			//     return Array.from(resSet).map(i => i.split(","));
			// };

			// // 去重优化
			// var threeSum = function(nums) {
			//     const len = nums.length;
			//     if(len < 3) return [];
			//     nums.sort((a, b) => a - b);
			//     const res = [];
			//     for(let i = 0; i < len - 2; i++) {
			//         if(nums[i] > 0) break;
			//         // a去重
			//         if(i > 0 && nums[i] === nums[i - 1]) continue;
			//         let l = i + 1, r = len - 1;
			//         while(l < r) {
			//             const sum = nums[i] + nums[l] + nums[r];
			//             if(sum < 0) { l++; continue };
			//             if(sum > 0) { r--; continue };
			//             res.push([nums[i], nums[l], nums[r]])
			//             // b c 去重 
			//             while(l < r && nums[l] === nums[++l]);
			//             while(l < r && nums[r] === nums[--r]);
			//         }
			//     }
			//     return res;
			// };
			// console.log(threeSum([-1,0,1,2,-1,-4]));
			console.log(threeSum([0, 0, 0, 0]));
		</script>
	</body>
</html>
